`timescale 1ns/1ps
`default_nettype none
module ex_mem_reg(
    input  wire        clk,          // 时钟：上升沿触发
    input  wire        rstn,         // 同步复位（低有效）：拉低时清零所有输出寄存器
    // ---------- 来自 EX 阶段（本拍产生） ----------
    input  wire [31:0] ex_alu_y,     // EX 阶段 ALU 计算结果（加/减等）
    input  wire [4:0]  ex_rd,        // 本条指令的目的寄存器号（将随流水线一路带到 WB）
    input  wire        ex_regwrite,  // 本条指令是否需要在 WB 写回寄存器

    // ---------- 输出到 MEM 阶段（下一拍被使用） ----------
    output reg  [31:0] mem_alu_y,    // 打拍后的 ALU 结果 → MEM 阶段（未来可作地址或写回值）
    output reg  [4:0]  mem_rd,       // 打拍后的 rd → 传递到 MEM/WB，再到 WB
    output reg         mem_regwrite  // 打拍后的写回使能 → 贯穿至 WB 控制写使能
);
    // 时序逻辑：同步复位清零；否则把 EX 信号在时钟上升沿锁存到 MEM 输出
    always @(posedge clk) begin
        if (!rstn) begin
            mem_alu_y    <= 32'b0;
            mem_rd       <= 5'b0;
            mem_regwrite <= 1'b0;
        end else begin
            mem_alu_y    <= ex_alu_y;
            mem_rd       <= ex_rd;
            mem_regwrite <= ex_regwrite;
        end
    end
endmodule